package beans;

import entidades.UnidadeMilitar;
import entidades.Usuario;
import excessoes.DAOException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Set;
import java.util.SortedMap;
import java.util.TreeMap;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.event.ValueChangeEvent;
import javax.faces.model.SelectItem;
import rn.SetorRN;
import util.ContextoUtil;
import util.FacesUtil;
import entidades.Setor;


/**
 *
 * @author Marcelo Gomes Neto
 */
@ManagedBean(name="setorBean")
@ViewScoped
public class SetorBean implements Serializable 
{
    private static final long serialVersionUID = 7968385747334564601L;
    private Setor setor = new Setor();
    private UnidadeMilitar unidadeMilitar = new UnidadeMilitar();
    private ContextoBean contextoBean = ContextoUtil.getContextoBean();
    //private Usuario usuario = contextoBean.getUsuarioLogado();
    private List<Setor> listar;
    private List<Setor> listarSetorPorOm;
    private List<SelectItem> listarDescricao;
    private SortedMap<String, Integer> listarTipos = new TreeMap<>(); //cria um mapa ordenado com treemap
    private Integer unidadeSelecionada;
    
    public void prepararAdicionarSetor(ActionEvent actionEvent) {
        this.setor = new Setor();
        this.unidadeMilitar = new UnidadeMilitar();
    }
    
    public String salvar() throws DAOException, Exception 
    {
        Usuario usuario = contextoBean.getUsuarioLogado();
        SetorRN setorRN = new SetorRN();

        this.unidadeMilitar.setIdunidade(this.unidadeSelecionada);
        //this.unidadeMilitar.getSetor().add(this.setor);
        this.setor.setUnidadeMilitar(this.unidadeMilitar);
        if (this.unidadeSelecionada == -1) {
            FacesUtil.getFacesContext().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_WARN, "Selecione a Unidade! Operação não realizada.", ""));
        }
        else 
        {
            setorRN.salvarSetor(this.setor, usuario);
            //this.setLista(pessoaRN.listar());
            this.setListarSetorPorOm(setorRN.listarSetorPorOM(this.unidadeSelecionada));
            this.setor = new Setor();
            this.unidadeMilitar = new UnidadeMilitar();
        }
        return null;
    }
        
    public String excluir() throws Exception
    {
        Usuario usuario = contextoBean.getUsuarioLogado();
        SetorRN setorRN = new SetorRN();
        setorRN.excluirSetor(this.setor, usuario);
        //this.setLista(null);
        this.setListar(setorRN.listarSetor());
        this.setor = new Setor();
        this.unidadeMilitar = new UnidadeMilitar();
        return null;
    }

    public List<Setor> getListar() 
    {
        if(this.listar == null)
        {
            SetorRN setorRN = new SetorRN();
            this.setListar(setorRN.listarSetor());
        }
        return this.listar;
    }

    public void setListar(List<Setor> listar) {
        this.listar = listar;
    }

    public List<SelectItem> getListarDescricao() 
    {
        List<SelectItem> descricoes = new ArrayList<>();
        SetorRN setorRN = new SetorRN();
        List<Setor> resultado = setorRN.listarSetorDescricao();
        for (Setor nome : resultado) {
            SelectItem item = new SelectItem(nome.getDescricaoSetor());
            descricoes.add(item);
        }
        return descricoes;
    }
    
    public void setListarDescricao(List<SelectItem> listarDescricao) {
        this.listarDescricao = listarDescricao;
    }

    public Set<Entry<String, Integer>> getListarTipos() 
    {
        SetorRN setorRN = new SetorRN();
        this.listar = setorRN.listarSetor();
        for (int i=0; i < listar.size(); i++)
        {
            Integer id = this.listar.get(i).getIdsetor();
            String descricao = this.listar.get(i).getDescricaoSetor();
            this.listarTipos.put(descricao, id);
        }
        return this.listarTipos.entrySet();
    }
    
    /*
    public SortedMap<Integer, String> getListarTipos2() 
    {
        TipoRevisaoRN tipoRevisaoRN = new TipoRevisaoRN();
        this.listar = tipoRevisaoRN.listarTipoRevisao();
        for (int i=0; i<listar.size();i++)
        {
            Integer id = this.listar.get(i).getIdTipoRevisao();
            String descricao = this.listar.get(i).getDescricao();
            this.listarTipos.put(id, descricao);
        }
        return this.listarTipos;
    }
    */
    public void setListarTipos(SortedMap<String, Integer> listarTipos) {
        this.listarTipos = listarTipos;
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }
    
    public void selecionaSetorPorOM(ValueChangeEvent event) 
    {
        Object valor = event.getNewValue(); 
        SetorRN setorRN = new SetorRN();
        this.unidadeSelecionada = (Integer)valor; 
        
        if(this.unidadeSelecionada != null) {
            this.setListarSetorPorOm(setorRN.listarSetorPorOM(this.unidadeSelecionada));
        }
    }
    
    /*
    public Setor carregaSetorUsuario(ValueChangeEvent event) 
    {
        Integer setorUsuario = (Integer) event.getNewValue(); 
        SetorRN setorRN = new SetorRN();
        return setorRN.carregaSetorPorOm(this.unidadeSelecionada, setorUsuario);

    }
    */
    public String buscar() 
    {
        if(this.unidadeSelecionada != null)
        {
            SetorRN setorRN = new SetorRN();
            this.setListarSetorPorOm(setorRN.listarSetorPorOM(this.unidadeSelecionada));
        }
        return null;
    }
        
    public List<Setor> getListarSetorPorOm() 
    {
        if(this.unidadeSelecionada != null)
        {
            SetorRN setorRN = new SetorRN();
            this.setListarSetorPorOm(setorRN.listarSetorPorOM(this.unidadeSelecionada));
        }
        return listarSetorPorOm;
    }

    public void setListarSetorPorOm(List<Setor> listarSetorPorOm) {
        this.listarSetorPorOm = listarSetorPorOm;
    }

    public Integer getUnidadeSelecionada() {
        return unidadeSelecionada;
    }

    public void setUnidadeSelecionada(Integer unidadeSelecionada) {
        this.unidadeSelecionada = unidadeSelecionada;
    }

    public UnidadeMilitar getUnidadeMilitar() {
        return unidadeMilitar;
    }

    public void setUnidadeMilitar(UnidadeMilitar unidadeMilitar) {
        this.unidadeMilitar = unidadeMilitar;
    }
}
